window: Add a GdkWindow:display property
authorBenjamin Otte <otte@redhat.com>
Thu, 27 Oct 2016 13:38:41 +0000 (15:38 +0200)
committerBenjamin Otte <otte@redhat.com>
Fri, 28 Oct 2016 02:45:35 +0000 (04:45 +0200)
... and make it an explicit property of the window struct instead of
looking it up in the visual.

gdk/gdkdisplay.c
gdk/gdkinternals.h
gdk/gdkwindow.c

index 56091810ff82d2ad43a6123de08e3d3ff54674e0..bef6be0faf7c2970add2e16d5173ce9f3c17de11 100644 (file)
@@ -1877,7 +1877,9 @@ _gdk_display_create_window_impl (GdkDisplay       *display,
 GdkWindow *
 _gdk_display_create_window (GdkDisplay *display)
 {
-  return g_object_new (GDK_DISPLAY_GET_CLASS (display)->window_type, NULL);
+  return g_object_new (GDK_DISPLAY_GET_CLASS (display)->window_type,
+                       "display", display,
+                       NULL);
 }
 
 /**
index 81b1e93bb61b3604ce398af7501a0c9b0bab9726..4a6396701dacd03b19b53d6a4751e9dd938fea5f 100644 (file)
@@ -151,6 +151,8 @@ struct _GdkWindow
 {
   GObject parent_instance;
 
+  GdkDisplay *display;
+
   GdkWindowImpl *impl; /* window-system-specific delegate object */
 
   GdkWindow *parent;
index 30647c70fa292032045776d69889423220972bfe..2b32b714f59769bfb85277bd0f91c357b632b9b6 100644 (file)
@@ -119,6 +119,7 @@ enum {
 enum {
   PROP_0,
   PROP_CURSOR,
+  PROP_DISPLAY,
   LAST_PROP
 };
 
@@ -289,6 +290,22 @@ gdk_window_class_init (GdkWindowClass *klass)
                            P_("Cursor"),
                            GDK_TYPE_CURSOR,
                            G_PARAM_READWRITE);
+
+  /**
+   * GdkWindow:display:
+   *
+   * The #GdkDisplay connection of the window. See gdk_window_get_display()
+   * for details.
+   *
+   * Since: 3.90
+   */
+  properties[PROP_DISPLAY] =
+      g_param_spec_object ("display",
+                           P_("Display"),
+                           P_("Display"),
+                           GDK_TYPE_DISPLAY,
+                           G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
+
   g_object_class_install_properties (object_class, LAST_PROP, properties);
 
   /**
@@ -401,6 +418,8 @@ gdk_window_finalize (GObject *object)
   if (window->devices_inside)
     g_list_free (window->devices_inside);
 
+  g_clear_object (&window->display);
+
   G_OBJECT_CLASS (gdk_window_parent_class)->finalize (object);
 }
 
@@ -410,7 +429,7 @@ gdk_window_set_property (GObject      *object,
                          const GValue *value,
                          GParamSpec   *pspec)
 {
-  GdkWindow *window = (GdkWindow *)object;
+  GdkWindow *window = GDK_WINDOW (object);
 
   switch (prop_id)
     {
@@ -418,6 +437,11 @@ gdk_window_set_property (GObject      *object,
       gdk_window_set_cursor (window, g_value_get_object (value));
       break;
 
+    case PROP_DISPLAY:
+      window->display = g_value_dup_object (value);
+      g_assert (window->display != NULL);
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -430,7 +454,7 @@ gdk_window_get_property (GObject    *object,
                          GValue     *value,
                          GParamSpec *pspec)
 {
-  GdkWindow *window = (GdkWindow *) object;
+  GdkWindow *window = GDK_WINDOW (object);
 
   switch (prop_id)
     {
@@ -438,6 +462,10 @@ gdk_window_get_property (GObject    *object,
       g_value_set_object (value, gdk_window_get_cursor (window));
       break;
 
+    case PROP_DISPLAY:
+      g_value_set_object (value, window->display);
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -2095,7 +2123,7 @@ gdk_window_get_display (GdkWindow *window)
 {
   g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
 
-  return gdk_screen_get_display (gdk_visual_get_screen (window->visual));
+  return window->display;
 }
 /**
  * gdk_window_is_destroyed: